package org.demo;

import lombok.Getter;
import lombok.Setter;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * MethodInterceptor这个类在Spring中使用spring-core模块中cglib.proxy包中的InvocationHandler代替(跟jdk动态代理的同名)
 *
 * @author yexi
 */
@Setter
@Getter
public class TransactionMethodInterceptor implements MethodInterceptor {

    private Object target;

    private TransactionManager tx;

    /**
     * 实现回调方法
     *
     * @param o           代理对象
     * @param method      目标对象中的方法的Method实例
     * @param objects     实际参数
     * @param methodProxy 代理对象中的方法的Method实例
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object result = null;
        try {
            tx.begin();
            System.out.println("代理对象是: " + o.getClass());
            System.out.println("代理对象的父类是: " + o.getClass().getSuperclass());
            System.out.println("代理对象实现的接口有: " + Arrays.toString(o.getClass().getInterfaces()));
            result = methodProxy.invokeSuper(o, objects);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        }
        return result;
    }
}
